Asynchronous Task Management এবং Worker Threads হল Node.js এর দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা অ্যাপ্লিকেশনগুলিতে উচ্চ পারফরম্যান্স এবং স্কেলেবিলিটি নিশ্চিত করতে ব্যবহৃত হয়। Node.js একটি single-threaded environment হলেও, asynchronous programming এবং worker threads ব্যবহার করে এটি একাধিক কাজ একসাথে (concurrently) করতে সক্ষম।
এখানে, আমরা Asynchronous Task Management এবং Worker Threads নিয়ে বিস্তারিত আলোচনা করব এবং কীভাবে এগুলি Node.js অ্যাপ্লিকেশনে কার্যকরভাবে ব্যবহার করা যায় তা দেখাব।
১. Asynchronous Task Management
Asynchronous programming হল এমন একটি পদ্ধতি যেখানে কাজগুলি একে অপরের সাথে পাল্লা দিয়ে চলতে থাকে, এমনকি একটি কাজ চলাকালীন অন্য কাজগুলি একসাথে (concurrently) সম্পাদিত হতে পারে। এটি সাধারণত callbacks, promises, এবং async/await ব্যবহারের মাধ্যমে করা হয়।
Asynchronous Programming Concepts
Callbacks: এটি হল এক ধরনের ফাংশন যা অন্য ফাংশন সম্পন্ন হওয়ার পরে কল হয়।
function doTask(callback) { setTimeout(() => { console.log('Task completed'); callback(); }, 1000); } doTask(() => { console.log('Callback executed'); });Promises: একটি promise হল একটি রিটার্নিং ভ্যালু যা আসন্ন ভবিষ্যতের কোনো সময়তে একটি মান বা ত্রুটি প্রদান করবে।
function fetchData() { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Data fetched successfully!'); }, 1000); }); } fetchData() .then(data => console.log(data)) .catch(err => console.log(err));Async/Await:
asyncএবংawaitES2017 (ES8) তে যোগ করা হয়েছিল, যা promises এর উপর ভিত্তি করে কাজ করে এবং asynchronous কোড লেখাকে আরও সিনক্রোনাস দেখতে সাহায্য করে।async function fetchData() { let data = await new Promise((resolve, reject) => { setTimeout(() => { resolve('Data fetched successfully!'); }, 1000); }); console.log(data); } fetchData();
Asynchronous Task Management এর সুবিধা:
- Non-blocking: এটি অন্য কাজের কার্যক্রমে বাধা দেয় না, কারণ সিঙ্ক্রোনাস প্রোগ্রামিংয়ের বিপরীতে, যেখানে এক কাজের শেষে অন্য কাজ শুরু হয়।
- Improved Performance: অ্যাসিনক্রোনাস টাস্ক ব্যবস্থাপনা ব্যবহার করলে CPU এর সময় কম ব্যয় হয়, এবং অ্যাপ্লিকেশন দ্রুত কাজ করতে পারে।
- Concurrency: একাধিক কাজ একসাথে করা যায়, কিন্তু thread-blocking এড়ানো হয়।
২. Worker Threads
Worker Threads Node.js এর একটি ফিচার যা আপনাকে একাধিক থ্রেডে কাজ করতে দেয়। এটি Node.js এর single-threaded nature কে বাইপাস করে multi-threading এর সুবিধা প্রদান করে।
Node.js সাধারণত একক থ্রেডে চলে, তবে কখনও কখনও কিছু CPU-intensive tasks (যেমন বড় ডাটা প্রসেসিং, গণনা ইত্যাদি) সম্পাদন করতে গেলে এই থ্রেডের উপর অতিরিক্ত চাপ পড়তে পারে। এতে অ্যাপ্লিকেশনের পারফরম্যান্স ক্ষতিগ্রস্ত হতে পারে। এই সমস্যা সমাধানে Worker Threads ব্যবহৃত হয়।
Worker Threads এর ব্যবহার
Worker Threads ইনস্টল এবং ব্যবহার করা
Node.js 10.x সংস্করণে Worker Threads পরীক্ষামূলকভাবে অন্তর্ভুক্ত হয়েছিল এবং 12.x সংস্করণে এটি সম্পূর্ণভাবে চালু হয়েছে।
Worker Threads ব্যবহারের জন্য Node.js এর বিল্ট-ইন
worker_threadsমডিউল ব্যবহার করা হয়।Basic Example of Worker Threads
একটি সাধারন worker thread উদাহরণ:
const { Worker, isMainThread, parentPort } = require('worker_threads'); if (isMainThread) { // Main thread: Create a worker thread const worker = new Worker(__filename); // The same file is used as worker worker.on('message', (message) => { console.log('Received from worker:', message); }); worker.on('error', (error) => { console.error('Error in worker:', error); }); worker.on('exit', (code) => { if (code !== 0) { console.error(`Worker stopped with exit code ${code}`); } }); } else { // Worker thread: Do some task parentPort.postMessage('Hello from worker!'); }এখানে:
- Main thread একটি worker thread তৈরি করে এবং তাকে কাজ দিয়ে থাকে।
- Worker thread কাজ সম্পন্ন হওয়ার পরে মেসেজ প্যারেন্ট থ্রেডকে পাঠায়।
Passing Data to Worker Threads
Worker Threads এর মধ্যে data পাঠাতে এবং গ্রহণ করতে message-passing মেকানিজম ব্যবহার করা হয়।
if (isMainThread) { const worker = new Worker('./worker.js'); worker.postMessage({ task: 'heavy computation' }); worker.on('message', (data) => { console.log('Result from worker:', data); }); } else { parentPort.on('message', (message) => { // Perform task based on received message console.log('Task received by worker:', message); parentPort.postMessage('Task complete!'); }); }এখানে,
postMessage()মেথডের মাধ্যমে ডাটা পাঠানো এবংon('message')ইভেন্টের মাধ্যমে ডাটা গ্রহণ করা হচ্ছে।
Worker Threads এর সুবিধা:
- Parallel Execution: Worker Threads একাধিক CPU কোরে একযোগভাবে কাজ করতে পারে, ফলে CPU-bound tasks দ্রুত সম্পন্ন হয়।
- Non-blocking: Main thread এর কাজ থামিয়ে না রেখে পার্শ্ববর্তী থ্রেডে কাজ করা যায়।
- Isolation: Worker threads একে অপর থেকে আলাদা এবং শুধুমাত্র মেসেজ পাস করে ডাটা আদান-প্রদান করে, ফলে সেগুলির মধ্যে কোনও পারস্পরিক প্রভাব নেই।
Example: CPU-intensive Task in Worker Threads
এখানে একটি CPU-intensive task, যেমন বড় সংখ্যার ফ্যাক্টোরিয়াল হিসাব করা, worker thread এর মাধ্যমে করা হয়েছে:
// factorial-worker.js
const { parentPort } = require('worker_threads');
function factorial(n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
parentPort.on('message', (number) => {
const result = factorial(number);
parentPort.postMessage(result);
});
// main.js
const { Worker } = require('worker_threads');
const worker = new Worker('./factorial-worker.js');
worker.postMessage(10); // Calculate 10!
worker.on('message', (result) => {
console.log('Factorial Result:', result); // Output: 3628800
});এখানে, worker thread factorial-worker.js ফাইলটিতে ফ্যাক্টোরিয়াল হিসাব করছে, এবং এটি মূল থ্রেডে রেজাল্ট পাঠাচ্ছে।
৩. Best Practices for Asynchronous Task Management and Worker Threads
- Use Worker Threads for CPU-Intensive Tasks: Worker threads কেবল CPU-intensive কাজের জন্য ব্যবহৃত হওয়া উচিত, যেমন বড় ডাটা প্রসেসিং, ফ্যাক্টোরিয়াল হিসাব, বা বড় সংখ্যার গণনা। I/O-bound tasks এর জন্য asynchronous techniques (callback, promises, async/await) যথেষ্ট।
- Limit the Number of Workers: Worker threads ব্যবহারের ক্ষেত্রে, খুব বেশি worker thread তৈরি করা CPU তে অতিরিক্ত চাপ ফেলতে পারে। তাই প্রয়োজন অনুযায়ী থ্রেড সংখ্যা নিয়ন্ত্রণ করতে হবে।
- Graceful Shutdown: Worker threads কে বন্ধ করার সময় graceful shutdown করা উচিত, যাতে সেগুলি তাদের কাজ সম্পন্ন করতে পারে এবং কোনও অসম্পূর্ণ ডাটা হারানো না হয়।
- Error Handling: Worker threads এ error হ্যান্ডলিং খুব গুরুত্বপূর্ণ। প্রতিটি worker এর জন্য error events এবং try-catch blocks ব্যবহার করা উচিত।
- Sharing Data Between Threads: Worker threads এর মধ্যে ডাটা শেয়ার করতে message passing ব্যবহৃত হয়, তবে খুব বড় ডাটা শেয়ার করার জন্য SharedArrayBuffer বা Transferable Objects ব্যবহার করা যেতে পারে।
সারাংশ
- Asynchronous Task Management Node.js এ একাধিক কাজ একসাথে সম্পাদন করতে সাহায্য করে এবং পারফরম্যান্স উন্নত করতে ব্যবহৃত হয়।
- Worker Threads CPU-intensive কাজগুলোকে আলাদা থ্রেডে প্রক্রিয়াকরণ করে, যাতে মূল থ্রেডের পারফরম্যান্স হ্রাস না পায় এবং অ্যাপ্লিকেশন দ্রুত কাজ করতে পারে।
- Asynchronous Programming এবং Worker Threads এর সংমিশ্রণ Node.js অ্যাপ্লিকেশনকে কার্যকরীভাবে স্কেল এবং অপ্টিমাইজ করতে সাহায্য করে।
এই
কৌশলগুলি আপনার Node.js অ্যাপ্লিকেশনকে আরও পারফরম্যান্ট এবং স্কেলেবল করে তুলবে, বিশেষত যখন অ্যাপ্লিকেশনটি অনেক বড় কাজ করতে হবে বা CPU-intensive প্রসেস পরিচালনা করতে হবে।
Read more